package org.example.day01;

import java.util.*;

/**
 * @author zlxad
 * @version 1.0
 * @description: TODO +
 * 给定一个数组，编写一个函数来计算它的最大N个数与最小N个数的和。你需要对数组进行去重。
 * 说明：
 * 数组中数字范围[0, 1000]
 * 最大N个数与最小N个数不能有重叠，如有重叠，输入非法返回-1
 * 输入非法返回-1
 * @date 2024/3/11 15:22
 */
public class test002 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 读入数组大小
        int M = scanner.nextInt();
        Set<Integer> numSet = new HashSet<>();

        // 读入数组内容，并进行去重
        for (int i = 0; i < M; i++) {
            numSet.add(scanner.nextInt());
        }

        // 读入N值
        int N = scanner.nextInt();

        // 关闭Scanner
        scanner.close();

        // 调用maxMinSum函数计算结果，并输出
        int result = maxMinSum(new ArrayList<>(numSet), N);
        System.out.println(result);
    }

    private static int maxMinSum(ArrayList<Integer> nums, int N) {
        // 特殊情况处理：当N为0时，应直接返回0，因为没有数需要计算和
        if (N == 0) {
            return 0;
        }

        // 检查数组中的数是否都在[0, 1000]范围内，如果有不满足条件的数，返回-1
        for (int num : nums) {
            if (num < 0 || num > 1000) {
                return -1;
            }
        }

        // 对去重后的数组进行排序
        Collections.sort(nums);

        // 如果去重后的数组长度小于2N，说明最大N个数和最小N个数有重叠，返回-1
        if (nums.size() < 2 * N) {
            return -1;
        }

        // 计算最小N个数的和
        int minSum = 0;
        for (int i = 0; i < N; i++) {
            minSum += nums.get(i);
        }

        // 计算最大N个数的和
        int maxSum = 0;
        for (int i = nums.size() - N; i < nums.size(); i++) {
            maxSum += nums.get(i);
        }

        // 返回最大N个数和最小N个数的和
        return minSum + maxSum;
    }
}






